package main

import "fmt"

//作业1
// s1 := make([]int,3,4)
// s2 := append(s1,1)
//s1内元素为[0 0 0]   s2内元素为[0 0 0 1]
//s1修改一个元素会影响s2,s2也会影响s1,因为共用一个底层数组
//s2再增加一个元素，s2会扩容变成len=5 cap=8的切片，但因为开辟了新的内存空间，地址改变，不会影响原来的底层数组，因此不会影响s1

//作业2
//有一个数组[1 4 9 16 2 5 10 15],生成一个新切片，要求新切片元素是数组相邻2项的和

func main() {
	arr := [8]int{1, 4, 9, 16, 2, 5, 10, 15}
	var sumSlice []int
	for i := 0; i < len(arr)-1; i++ {
		sum := arr[i] + arr[i+1]
		sumSlice = append(sumSlice, sum)
	}
	fmt.Println(sumSlice)
}

//作业3
////数组和链表各有什么优劣
//数组（Array）：
//优点：
//随机访问快速：由于数组是一块连续的内存空间，因此可以通过索引直接访问任何元素，访问速度很快，时间复杂度为O(1)。

//内存利用率高：相对于链表，数组的内存占用更小，因为它不需要额外的指针来存储元素之间的关系。

//缺点：
//大小固定：数组的大小通常在创建时就固定了，如果需要更多的空间，可能需要创建一个新的更大的数组，将数据复制过去，这可能会导致性能开销。

//插入和删除开销大：在数组中插入或删除元素通常需要将其他元素移动以维护连续性，因此插入和删除操作的平均时间复杂度为O(n)。

//链表（Linked List）：
//优点：
//动态大小：链表的大小可以动态增长或缩小，不需要预先分配固定大小的内存空间。

//插入和删除效率高：在链表中插入或删除元素通常只需要调整指针，不需要移动其他元素，因此插入和删除操作的平均时间复杂度为O(1)。

//缺点：
//随机访问慢：要访问链表中的特定元素，需要从头部开始遍历，直到找到目标元素，因此访问速度较慢，时间复杂度为O(n)。

//内存占用较大：链表需要额外的指针来存储元素之间的关系，因此相对于数组，内存占用较大。
